PHP设计模式--状态模式

今天学习的是 状态模式(State) ,一种行为型模式。
 状态模式从代码结构上分析有点和职责链模式相似,每个状态有自己的上限,一旦超出会成为另一种状态。
 状态模式的定义:允许一个对象在其内部状态改变时改变它的行为。
 而状态模式就是分离对象的状态,封装到专门的状态类中。
 优点是,把各个状态分离开,便于横向扩展,灵活性高。

 如果光学习概念其实比较抽象,下面举一个实用的小例子:
 所有做过互联网商城的公司都知道,消费会有积分,而积分的大小决定了该名会员的等级。
 等级比方说有:黄金,铂金,钻石之类的。

 代码如下:

<?php  
  
header("Content-Type:text/html;charset=utf-8");  
  
require_once "State.php";  
  
$state = new State();  
  
// 积分为 500的时候  
$state->score = 500;  
$state->Grade();  
  
// 积分为1000的时候  
$state->score = 1000;  
$state->Grade();  
  
// 积分为10000的时候  
$state->score = 100000;  
$state->Grade();  
<?php  
// 状态接口  
interface IState  
{  
    /**  
     * 显示等级接口函数  子类必须执行  
     * @access public   
     * @param  object  $A  
     */  
    public function Grade(State $A);  
}  
  
// 等级黄金  
Class Golden implements IState  
{  
    /**  
     * 显示等级  
     * @access public   
     * @param  object  $A  
     */  
    public function Grade(State $A)  
    {  
        if($A->score > 0 && $A->score < 1000)  
        {  
            echo "{$A->score}点积分,黄金会员<br/>";  
        }  
        else  
        {  
            // 超出等级 进入下级  
            $A->SetState(new Platinum());  
            $A->Grade();  
        }  
    }  
}  
  
// 等级铂金  
Class Platinum implements IState  
{  
   /**  
     * 显示等级  
     * @access public   
     * @param  object  $A  
     */  
    public function Grade(State $A)  
    {  
        if($A->score < 10000 && $A->score >= 1000)  
        {  
            echo "{$A->score}点积分,铂金会员<br/>";  
        }  
        else  
        {  
             // 超出等级 进入下级  
            $A->SetState(new Diamond());  
            $A->Grade();  
        }  
    }     
}  
  
// 等级钻石  
Class Diamond implements IState  
{  
   /**  
     * 显示等级  
     * @access public   
     * @param  object  $A  
     */  
    public function Grade(State $A)  
    {  
        if($A->score  >= 10000)  
        {  
            echo "{$A->score}点积分,铂金会员<br/>";  
        }  
    }     
}  
  
// 统一状态类  
Class State  
{  
    /**  
     * 初始化对象  
     * @var object  
     */  
    private $first;  
      
    /**  
     * 积分值  
     * @var int  
     */  
    public $score;  
  
   /**  
     * 构造函数 初始化 
     * @access public    
     */  
    function __construct()  
    {  
        $this->first = new Golden();  
    }  
  
   /**  
     * 设置下级等级  
     * @access public   
     * @param  object  $s   
     */  
    function SetState(IState $s)  
    {  
        $this->first = $s;  
    }  
  
   /**  
     * 显示等级 
     * @access public     
     */  
    function Grade()  
    {  
        $this->first->Grade($this);  
    }  
}  

输出结果:

500点积分,黄金会员
1000点积分,铂金会员
100000点积分,铂金会员


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值